# REST framework之路由和渲染器

# 路由

  • # 传统的url路径写法
    urlpatterns = [
    	...
        url(r'(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()),
    ]
    
  • # 使用了GenericViewSet后,url得as_view函数可以传入字典
    url(r'(?P<version>[v1|v2]+)/v1/$', views.V1View.as_view({'get': 'list', 'post': 'create'})),
    
  • # 定制新的url规则
    url(r'(?P<version>[v1|v2]+)/v1\.(?P<format>\w+)$', views.V1View.as_view({'get': 'list',
    'post': 'create'}))
    
     # 通过上面得规则我们就可以把我们想要得编码格式写在url中,从而获得想应得数据
     http://127.0.0.1:8000/api/v1/v1.json --> 获得json数据
    
    • 上面得方式和下面得渲染器传递得format参数一致,都是给渲染器传递一个参数,这样就可以让渲染器返回相应得数据给浏览器
  • # 结合渲染器使用
     #通过路径后在浏览器中我们看到了渲染后的页面,如果我们想只看json形式,可以通过format参数
    1、http://127.0.0.1:8000/api/v1/v1/  --> 得到渲染后的页面
    2、http://127.0.0.1:8000/api/v1/v1/?format=json  --> 得到json数据
    
# 全自动路由
from django.conf.urls import url,include

from api import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'xxx',views.V1View)  # 注册视图类,第一个参数是拼接得第一端
router.register('rt',views.V1View)


urlpatterns = [
	...
    url(r'^(?P<version>[v1|v2]+)/',include(router.urls))
]

  # 我们访问一个错误网址即可获得所有网址:
^admin/
^api/ ^(?P<version>[v1|v2]+)/ ^xxx/$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^xxx\.(?P<format>[a-z0-9]+)/?$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^xxx/(?P<pk>[^/.]+)/$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^xxx/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^rt/$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^rt\.(?P<format>[a-z0-9]+)/?$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^rt/(?P<pk>[^/.]+)/$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^rt/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^$ [name='api-root']
^api/ ^(?P<version>[v1|v2]+)/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
  • # 小提示:
    1、全自动路由,一般只是对简单得增删改查表得时候使用
    
#

# 渲染器

  • # 渲染器简单使用
    from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer,AdminRenderer
    class TestView(APIView):
        
        renderer_classes = [AdminRenderer,JSONRenderer,BrowsableAPIRenderer]   # 默认以第一个元素类进行渲染,其余得可以通过format进行选择,BrowsableAPIRenderer只是用来渲染网页得
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            roles = models.Role.objects.all()
            # 创建分页对象
            pg = MyCursorPagination()
            # 在数据库中获取分页数据
            page_role = pg.paginate_queryset(queryset=roles, request=request, view=self)  # 在全局配置PAGE_SIAE
            print(page_role)
            # 对数据进行序列化
            ser = PagerSerializer(instance=page_role, many=True)
            return Response(ser.data)
       
    -------------------------------------------------------------
        # url.py文件中
       urlpatterns = [
        url(r'^(?P<version>[v1|v2]+)/',include(router.urls)),
        url(r'(?P<version>[v1|v2]+)/test/$', views.TestView.as_view()),
    ] 
    
    • 小提示:

      1、/api/v1/test/?format=api  --> 访问浏览器渲染
      2、/api/v1/test/?format=json --> 访问的数据进行json
      3、/api/v1/test/?format=admin --> 访问数据通过admin界面
      
  • # 全局设置渲染器
    REST_FRAMEWORK = {
        'DEFAULT_VERSION':'v1',
        'ALLOWED_VERSIONS':['v1','v2'],
        'VERSION_PARAM':'version',  # 允许得key;version=v1
        'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser'],
        'PAGE_SIZE':3,
        'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer',
        							'rest_framework.renderers.BrowsableAPIRenderer']
    }
    
# 自定义模板
我们知道BrowsableAPIRenderer,是用来进行模板渲染得,我们可以继承它,并将模板进行重写,然后修改里面得template模板即可。